#include "bmemallocators.h"

/*
 * 思想，申请一大块内存，然后再切割成不同大小的当前内容。同BMemAllocator相比利用嵌入式指针概念将数据类型中next指针和数据放入union，节省这部分内存。
 * 缺点：
 *      1、由于所有的释放都是再delete中进行，当使用大数量当前数据结构时，最终都会在delete中链接到一起。
 *      2、由于只有new char操作，没有delete操作，最终内存无法及时还给操作系统
*/

void *BMemAllocatorS::operator new(size_t size)
{
    if (size != sizeof (BMemAllocatorS))
        return ::operator new(size);

    BMemAllocatorS *p = headofFreeList;
    if (p)
        headofFreeList = p->next;
    else
    {
        BMemAllocatorS *newBlocks = static_cast<BMemAllocatorS*>(::operator new(nBSize * size));
        for (int i = 0; i < nBSize - 1; ++i)
        {
            newBlocks[i].next = &newBlocks[i + 1];
        }
        newBlocks[nBSize].next = nullptr;

        p = &newBlocks[0];
        headofFreeList = p->next;
    }
    return p;
}

void BMemAllocatorS::operator delete(void *ptr)
{
    //
    static_cast<BMemAllocatorS*>(ptr)->next = headofFreeList;
    headofFreeList = static_cast<BMemAllocatorS*>(ptr);
}
